﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Knights.Objeto.Tecnicas;
using Knights.Objeto.Articulos;

namespace Knights.Objeto
{
    class Caballero
    {
        private int NivelMaximo = 50;

        private string nombre, rango;
        private int nivel, salud, energia, batallasGanadas, batallasJugadas;
        private int fuerza, valor, temple, velocidad;
		private int bonusFuerza, bonusValor, bonusArmadura, bonusResistencia;
        private long experienciaTotal, monedasOro;

        private Estado estado;
        private ListaTecnicas tecnicas;
        private ListaArticulos articulos;
        private Equipo equipo;

        public Caballero(string nombre)
        {
            this.nombre = nombre;
            rango = "Legionario";
            nivel = 20;
            batallasGanadas = 0;
            batallasJugadas = 0;
            
            fuerza = nivel;
            valor = nivel;
            temple = nivel;
            velocidad = nivel;

            salud = CalcularSalud();
            energia = CalcularEnergia();

            experienciaTotal = 0;
            monedasOro = 0;

            estado = Estado.Normal;
            articulos = new ListaArticulos();
            equipo = new Equipo(articulos);
            tecnicas = new ListaTecnicas(this);

            //
            equipo.EquiparArticulo(articulos.Articulo(0));
            equipo.EquiparArticulo(articulos.Articulo(1));
        }

        public string ActivarTecnica(int numero)
        {
            return tecnicas.ActivarTecnica(numero);
        }

        public void RecargarTecnicas()
        {
            tecnicas.Recargar();
        }

        public int CalcularSalud()
        {
            return (500 + 50 * temple);
        }

        public int CalcularEnergia()
        {
            return (200 + 30 * temple);
        }

        public long ExperienciaNecesaria()
        {
            long experiencia = 0;
            for (int i = 1; i <= nivel; i++)
                experiencia = experiencia + 100 * i;
            return experiencia;
        }

        public float PorcentajeExperiencia()
        {
            long experiencia = ExperienciaNecesaria() - 100 * nivel;
            return (100 * (experienciaTotal - experiencia) / (ExperienciaNecesaria() - experiencia));
        }

        public void SubirDeNivel()
        {
            if (nivel < NivelMaximo)
                if (experienciaTotal >= ExperienciaNecesaria())
                {
                    nivel++;
                    fuerza++;
                    valor++;
                    temple++;
                    velocidad++;
                    salud = CalcularSalud();
                    energia = CalcularEnergia();
                }
        }

        public string Nombre { get { return nombre; } }

        public string Rango { get { return rango; } }

        public int Nivel { get { return nivel; } }

        public Estado Estado
        {
            get { return estado; }
            set { estado = value; }
        }

        public int Salud
        {
            get { return salud; }
            set { salud = value; }
        }

        public int Energia
        {
            get { return energia; }
            set { energia = value; }
        }

        public float Reputacion
        {
            get { return (100 * batallasGanadas / batallasJugadas); }
        }

        public int Fuerza
        {
            get { return (fuerza + bonusFuerza); }
            set { bonusFuerza = value; }
        }

        public int Valor
        {
            get { return (valor + bonusValor); }
            set { bonusValor = value; }
        }

        public int Armadura
        {
            get { return (equipo.Armadura + bonusArmadura); }
            set { bonusArmadura = value; }
        }

        public int Danio
        {
            get { return (int)(Fuerza * 5 + 100 + equipo.Danio); }
        }

        public float Critico
        {
            get { return (Valor * 0.5f); }
        }

        public int Resistencia
        {
            get { return (temple + equipo.Resistencia + bonusResistencia); }
            set { bonusResistencia = value; }
        }

        public int Recarga
        {
            get { return (velocidad * 1); } //probando
        }
    }
}
